如果你是一個習慣寫 Java 後端的工程師,大概對這個畫面不陌生。系統上線初期流量還小,每個 API 都反應飛快,Controller 收到請求,Service 呼叫下游,Repository 打資料庫,一條 Thread 從頭跟到尾,簡單直觀。直到某天流量開始往上衝,你打開監控面板,發現 Thread Pool 使用率貼著上限跑,新進來的請求開始排隊,有些甚至直接逾時。你加大 Thread Pool 設定,暫時緩解,過幾天流量再漲一階,同樣的警報又跳出來。你開始懷疑,問題是不是根本不在 Thread 數量夠不夠,而在於每一條 Thread 大半時間都在等,等資料庫回應、等外部 API 回應,卻仍然白白佔著一條作業系統等級的資源不放。
這時候你可能已經聽過 Kotlin 協程這個詞,甚至讀過幾篇介紹 suspend 關鍵字的文章,知道它能讓程式碼看起來像同步、實際上卻不阻塞執行緒。但知道這件事和真的把它用進一個 Spring Boot 後端服務,中間隔著一段不小的距離。協程官方文件會告訴你 launch、async、Dispatchers 怎麼用,卻不會告訴你在一個每秒要扛住數千請求的訂單服務裡,什麼時候該用 Semaphore 節流、什麼時候該設 withTimeout、資料庫連線池又該怎麼配置才不會在協程情境下被悄悄耗盡。這中間的落差,正是這個系列要補上的部分。
這個系列不會把 30 天內容寫成 Kotlin 協程官方文件或 Spring 官方文件的中文導讀。核心立場很明確,目標不是背熟協程有哪些 API,而是遇到一個具體的高併發情境時,你知道該用哪個協程機制、為什麼是它而不是別的選項、如果不用又會付出什麼代價。終極目的是讓你能對照自己原本熟悉的 Thread 模型,講得出協程模型的差異與取捨,而不是換一套語法把同一套思維重寫一遍。
做法是全系列共用一個輕量示範情境,一個訂單查詢與扣庫存服務。這個情境從第一天只是一個單一的 suspend function 雛形開始出現,隨著系列推進,逐步加上限流、逾時、資料庫連線池這些真實情境會遇到的複雜度,到了系列後段的實戰整合期,收斂成一個具備監控、壓力測試、部署經驗的完整服務。這個情境刻意保持輕量,每天只取用其中一個切片,你不需要回頭補完整段程式碼才看得懂當天內容,但如果你一路跟到最後,會清楚感覺到這個服務隨著系列推進逐漸長大、逐漸貼近真正會上線的生產環境長相。
這個系列鎖定三種讀者輪廓,你可能同時符合不只一種。第一種是 Java 後端工程師,正打算或正在轉往 Kotlin,但還沒真正建立協程的心智模型,習慣 Thread、Executor 這類傳統並發思維,需要有人把協程「翻譯」成你已經熟悉的概念,再一步步拉開兩者的差異。第二種是對 Kotlin 語法已經有基礎,看得懂 data class、擴充函式、Lambda,但沒有 Spring Boot 後端實戰經驗,還需要補齊 Controller、Service、Repository 這些基本分層與請求生命週期的知識。第三種讀者可能連 Thread-per-Request 這種傳統模型實際怎麼運作都還不熟悉,這系列不會預設你已經懂,會在深入協程前先把這塊地基補上。
如果你曾經找過 Kotlin 協程的中文教學,可能會注意到我另外也寫過一個系列,「異步程式設計修煉:Kotlin Coroutines 完全指南」,同樣談協程,但那個系列聚焦在協程作為一套語言機制本身,不綁定任何後端框架,講的是協程在純 Kotlin 世界裡怎麼運作。這個系列不一樣,會把協程放進 Spring Boot 後端的高併發情境裡實戰,從 API 收到請求的那一刻開始,一路談到資料庫交易、連線池、壓力測試與上線部署。兩個系列不是誰取代誰,如果你連 suspend function 都還沒摸過,那個系列會是更基礎的起點;但你不需要先讀過那個系列才能開始這裡,這個系列本身也會從 suspend function 重新講起,只是講完基礎地基之後,很快就會把重心放回「這在 Spring Boot 後端裡到底該怎麼用」這個問題上。
以下依五個階段分組呈現整個系列的全貌。每個階段標題下方先說明這個階段要讓你建立起什麼樣的能力,再列出該階段每一天的標題與一句話定位。閱讀當下不需要理解每一天的技術細節,只需要對整體節奏有個印象,等你實際走到某一天,回來這裡對照一下自己的位置即可。
四天,目標是建立協程存在的動機、對照傳統並發模型,寫出並看懂第一個 suspend function。
五天,目標是建立 Coroutine Scope、Structured Concurrency、Dispatchers、Context、例外處理這些協程核心機制的正確心智模型。
五天,目標是理解協程如何分別與 Spring MVC、WebFlux、R2DBC、訊息佇列等既有機制搭配,掌握選型判斷依據。
七天,目標是掌握併發限制、逾時取消、背壓、連線池搭配、效能量測比較這些生產環境必備的控制手段。
九天,目標是把前四階段觀念收斂進一個具名示範專案,補齊監控、日誌、壓力測試、部署上線的完整經驗。本階段自 Day 22 起不建立可下載的完整原始碼倉庫,各天僅以程式碼片段搭配說明呈現。
SELECT FOR UPDATE 搭配 R2DBC 交易與協程的做法30 天的天數配置刻意不均分,這是一套有意識設計的難度曲線。前兩個階段合計用掉 9 天把地基與核心觀念打穩,目的是避免你在還沒理解 Structured Concurrency 之前,就被丟進 Semaphore、Channel 這些進階控制手段,只能似懂非懂地照抄用法。併發深化期拉到七天,是因為這正是「高併發」這個系列標題真正要兌現的部分,也是多數協程教學文章停在語法介紹就打住、沒有真正碰觸的區域。實戰整合期收在九天,讓你看到前面所有觀念最終如何收斂進一個具備監控、壓測、部署經驗的完整服務,而不是學完一堆零散技巧後就沒有下文。
這份地圖上的每一格,都是為了回應開場那個會卡住的 API。它不會因為你讀完 30 天就自動消失,但你會清楚知道,下次面對類似情境時,問題出在哪一層,該用哪個協程機制回應,以及選擇協程之後,你實際上是在用什麼代價換取什麼好處。這件事光看地圖還無法被說服,需要跟著往下走,一步一步驗證。
明天我們將正式進入《Day 01:為什麼高併發後端需要協程,從一個會卡住的 API 說起》,把今天先按下不表的那個會卡住的 API,攤開來看清楚它到底卡在哪裡。